package com.deyuanyun.pic.settings.domain.util;

import org.apache.commons.beanutils.PropertyUtils;

/**
 * 类反射Util，目前主要包含设置一个Object字段的属性值
 * 
 * 目前并未发现公共项目中有类似方法，公共项目中实在太多Util了，如果有的话，可以删掉这个Class。
 * 
 * @date 2016-03-31
 * @author ChenKui
 *
 */
public class DomainFieldReflectUtil {

	/**
	 * 设置属性值，目前没有考虑去调用set方法来做，直接.setAccessible(true)。
	 * 
	 * @param obj
	 * @param fieldName
	 * @param fieldValue
	 * @throws Exception 
	 * @throws  
	 */
	public static void setFieldValue(Object obj,String fieldName,Object fieldValue){
		//TODO CK：这个反射获取Method未优化，有一定效率问题。
		try {
		    PropertyUtils.setProperty(obj, fieldName, fieldValue);
		    //Method m = obj.getClass().getMethod("set" + StringUtils.toUpperCaseFirstOne(fieldName), fieldValue.getClass());
			//Field field = obj.getClass().getDeclaredField(fieldName);
			//field.setAccessible(true);
			//field.set(obj, fieldValue);
		    //m.invoke(obj, fieldValue);
		}catch (Exception e) {
		    //TODO 未来：不抛异常，可以抛一个警告。因为还是有一些domain中确实不存在字段。
			//throw new RuntimeException(e);
		}
		
	}
	
	/**
	 * 通过反射得到对象的属性值。调用对象的get方法。
	 * @param obj
	 * @param fieldName
	 * @return
	 */
	public static Object getFieldValue(Object obj,String fieldName){
        
	    Object fieldValue;
        try {
            fieldValue = PropertyUtils.getProperty(obj, fieldName);
            //String method_name = "get" + StringUtils.toUpperCaseFirstOne(fieldName);
            //Method m = obj.getClass().getMethod(method_name);
            //fieldValue = m.invoke(obj);
            /*
            Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            fieldValue = field.get(obj);*/
        }catch (Exception e) {
            //TODO 未来：不抛异常，可以抛一个警告。因为还是有一些domain中确实不存在字段。
            //throw new RuntimeException(e);
            fieldValue = null;
        }
        return fieldValue;
    }
	
}
